/*
 * StickMan.cpp
 *
 *  Created on: 27/08/2008
 *      Author: samuel.grigolato
 */

#include "Player.h"
#include "Bomba.h"

Player::Player() {
	FatorVelocidade = 3;
	LimiteBombas = 1;
	Morto = false;
	HoraMorte = 0;
	PoderFogo = 2;
	PorcentagemFisicaHeight = 0.8;
}

Player::~Player() {
	//
}

bool Player::Init(int posicaoX, int posicaoY, int alturaMapa, int larguraMapa) {
	CEntity::Init(posicaoX, posicaoY);

	int LarguraTela = CParametros::GetLarguraJanela();
	int AlturaTela = CParametros::GetAlturaJanela();
	int LarguraTile = CParametros::GetLarguraTile();
	int AlturaTile = CParametros::GetAlturaTile();

	if (OnLoad("./gfx/player.bmp", 34, 46, 3) == false) {
		return false;
	}

	X = ((LarguraTela - (LarguraTile * CParametros::GetLarguraMapa())) / 2) - Width + (LarguraTile * 2);
	Y = ((AlturaTela - (AlturaTile * CParametros::GetAlturaMapa())) / 2) - Height + (AlturaTile * 2);

	CEntity::EntityList->push_back(this);

	return true;
}

void Player::OnKeyDown(SDLKey sym, SDLMod mod, Uint16 unicode) {
	if (Morto)
		return;

	CMovimentavel::OnKeyDown(sym, mod, unicode);
	switch (sym) {
	case SDLK_SPACE:
		if (LimiteBombas > 0) {
			Bomba* bomba = new Bomba();
			bomba->PoderFogo = PoderFogo;
			bomba->TileX = TileX;
			bomba->TileY = TileY;
			bomba->Dono = this;
			if (bomba->RecuperaColisoes().size() == 0) {
				LimiteBombas--;
				bomba->Init(TileX, TileY);
			} else {
				delete bomba;
			}
		}
		break;
	default:
		break;
	}
}

void Player::ProcessaColisao(CEntity* Entidade, TipoColisao TpColisao) {
	if (TpColisao == FOGO) {
		Mata();
	}
	if (TpColisao == ITEM) {
		CItem* Copia = ((CItem*) Entidade)->Clone();
		Copia->Anexa(this);
		Copia->Trash = false;
		Itens.push_back(Copia);
	}
}

void Player::Mata() {
	int LarguraTela = CParametros::GetLarguraJanela();
	int AlturaTela = CParametros::GetAlturaJanela();
	int LarguraTile = CParametros::GetLarguraTile();
	int AlturaTile = CParametros::GetAlturaTile();

	int BackgroundX = (LarguraTela - (LarguraTile
			* CParametros::GetLarguraMapa())) / 2;
	int BackgroundY =
			(AlturaTela - (AlturaTile * CParametros::GetAlturaMapa())) / 2;

	Morto = true;
	AnimState = 5;
	ControleAnimacao.SetFrameRate(250);
	MovBaixo = false;
	MovCima = false;
	MovDireita = false;
	MovEsquerda = false;
	HoraMorte = SDL_GetTicks();

	for (Uint32 i = 0; i < Itens.size(); i++) {
		if (CEntity::ConfiguraTileVazio(Itens[i]) == true) {
			Itens[i]->X = BackgroundX + Itens[i]->TileX * LarguraTile;
			Itens[i]->Y = BackgroundY + Itens[i]->TileY * AlturaTile;
			Itens[i]->Init(Itens[i]->TileX, Itens[i]->TileY);
			EntityList->insert(EntityList->end() - 1, Itens[i]);
		}
	}
	Itens.clear();
}

void Player::OnLoop() {
	CMovimentavel::OnLoop();
	if (Morto) {
		long ticks = SDL_GetTicks();
		if (ticks - HoraMorte > 500) {
			Morto = false;
			FatorPatins = 0;
			PoderFogo = 2;
			LimiteBombas = 1;
			ControleAnimacao.SetCurrentFrame(0);
			ControleAnimacao.SetFrameRate(100);
		}
	}
	ProcessaColisoes(PLAYER);
}

void Player::AtualizaAnimState() {
	CMovimentavel::AtualizaAnimState();
	if (Morto) {
		AnimState = 5;
	}
}

